弹出视图修饰符(Presentation

这些修饰符用于配置通过 sheet 呈现的视图的行为和外观,包括在不同尺寸环境下的适配方式、拖拽指示器、支持的尺寸(detents)、背景交互、滚动与调整优先级等。

这些修饰符应作用于 被 sheet 弹出显示的根视图(例如 <VStack><NavigationStack><List>)。


presentationCompactAdaptation

定义当设备处于 横向或纵向紧凑尺寸类(Compact Size Class) 时,sheet 的适配方式。

类型

1presentationCompactAdaptation?: PresentationAdaptation | {
2  horizontal: PresentationAdaptation
3  vertical: PresentationAdaptation
4}

PresentationAdaptation 可选值:

  • "automatic":系统默认行为
  • "fullScreenCover":使用全屏显示
  • "sheet":使用普通 sheet 弹出样式
  • "popover":使用气泡样式(部分平台支持)
  • "none":不进行适配(尽可能维持原样)

示例

1<NavigationStack
2  presentationCompactAdaptation={{
3    horizontal: "fullScreenCover",
4    vertical: "sheet"
5  }}
6>
7  {/* 弹出内容 */}
8</NavigationStack>

presentationDragIndicator

控制 sheet 顶部是否显示 拖拽指示器(即小横条)。

类型

1presentationDragIndicator?: "visible" | "hidden" | "automatic"

示例

1<VStack presentationDragIndicator="visible">
2  <Text>可以拖动顶部指示器来改变高度</Text>
3</VStack>

presentationDetents

定义 sheet 支持的 高度位置(detents),用户可以通过拖拽在这些高度间切换。

类型

1presentationDetents?: PresentationDetent[]

PresentationDetent 可选值:

  • "medium":大约为屏幕高度的一半(在紧凑纵向尺寸下无效)
  • "large":占满整个屏幕高度
  • number > 1:表示固定的高度(单位为 pt)
  • 0 < number <= 1:表示按屏幕高度的百分比(例如 0.5 表示 50% 高度)

示例

1<VStack presentationDetents={[200, "medium", "large"]}>
2  <Text>拖动可在不同高度之间切换</Text>
3</VStack>

presentationBackgroundInteraction

定义在弹出页面显示时,用户是否可以与 底层视图交互

类型

1presentationBackgroundInteraction?:
2  | "automatic"
3  | "enabled"
4  | "disabled"
5  | { enabledUpThrough: PresentationDetent }

示例:仅在 sheet 高度较小时允许背景交互

1<VStack presentationBackgroundInteraction={{
2  enabledUpThrough: "medium"
3}}>
4  <Text>当 sheet 为中等高度时,背景可交互</Text>
5</VStack>

presentationContentInteraction

控制在向上滑动手势中,sheet 是优先 调整高度 还是 滚动内容

类型

1presentationContentInteraction?: "automatic" | "resizes" | "scrolls"

说明

  • "resizes":优先调整 detent 高度,滚动内容居后
  • "scrolls":立即滚动内部内容(如 ScrollView)
  • "automatic":系统默认行为(通常优先调整 detent)

示例

1<ScrollView presentationContentInteraction="scrolls">
2  {/* 向上滑时会立即滚动,而不会先调整 sheet 高度 */}
3</ScrollView>

presentationCornerRadius

设置 sheet 背景的 圆角半径

类型

1presentationCornerRadius?: number

示例

1<VStack presentationCornerRadius={16}>
2  <Text>该 sheet 具有圆角背景</Text>
3</VStack>

完整使用示例

1function SheetPage({ onDismiss }: {
2  onDismiss: () => void
3}) {
4  return <NavigationStack>
5    <List navigationTitle="弹出页">
6      <Text font="title" padding={50}>
7        拖动指示器可改变 sheet 高度。
8      </Text>
9      <Button
10        title="关闭"
11        action={onDismiss}
12      />
13    </List>
14  </NavigationStack>
15}
16
17<Button
18  title="显示"
19  action={() => setIsPresented(true)}
20  sheet={{
21    isPresented: isPresented,
22    onChanged: setIsPresented,
23    content: <SheetPage
24      presentationDragIndicator="visible"
25      presentationDetents={[200, "medium", "large"]}
26      onDismiss={() => setIsPresented(false)}
27    />
28  }}
29/>

修饰符汇总

修饰符 功能说明
presentationCompactAdaptation 设置在紧凑尺寸类下的适配方式
presentationDragIndicator 控制是否显示拖拽指示器
presentationDetents 定义 sheet 可拖拽的高度(支持多个)
presentationBackgroundInteraction 设置是否允许与背景内容交互
presentationContentInteraction 控制是优先滚动还是优先调整高度
presentationCornerRadius 设置 sheet 的圆角大小